package main

import (
	"fmt"
	"sync"
	"sync/atomic"
)

// 懒汉式单例模式

type singleton struct {
}

// 定义一个锁

var lock sync.Mutex

// 定义一个标记
var initialized uint32

var instance *singleton = new(singleton)

func GetInstance() *singleton {
	if atomic.LoadUint32(&initialized) == 1 {
		return instance
	}
	// 如果没有 则加锁
	lock.Lock()
	defer lock.Unlock()

	// 只有首次 GetInstance 方法才被调用 才会生成这个到单例的对象
	if instance == nil {
		instance = new(singleton)
		//标记为1
		atomic.StoreUint32(&initialized, 1)
	}
	return instance
}

func (s *singleton) SomeThing() {
	fmt.Println("单例的某个方法")
}

func main() {
	s1 := GetInstance()
	s1.SomeThing()

	s2 := GetInstance()

	if s1 == s2 {
		fmt.Println("s1==s2")
	}
}
